package heap

// symbolic reference
type SymRef struct {
	cp        *ConstantPool
	className string
	class     *Class //这里是符号引用对应的类。也起到一个缓存的作用。见ResolvedClass
}

func (self *SymRef) ResolvedClass() *Class {
	if self.class == nil {
		self.resolveClassRef()
	}
	return self.class
}
/*
class A{
	public static void main(){
		new B();
	}
}
*/
// jvms8 5.4.3.1
func (self *SymRef) resolveClassRef() {
	d := self.cp.class //这里的类是当前常量池关联的类（也就是当前运行方法所在的类） //这里的类指的是A
	c := d.loader.LoadClass(self.className)  //这里是依据类符号引用解析后得到的类。//这里的类指的是B
	if !c.isAccessibleTo(d) {
		panic("java.lang.IllegalAccessError")
	}

	self.class = c
}
